//package com.ming.liteflow.util;
//
//import com.ming.liteflow.core.json.ELJson;
//import com.ming.liteflow.core.graph.GraphEL;
//import com.ming.liteflow.core.graph.LogicFlowData;
//import com.ming.liteflow.core.graph.Node;
//import com.ming.liteflow.core.json.ELJsonUtil;
//import com.yomahub.liteflow.builder.el.ELBus;
//import com.yomahub.liteflow.builder.el.ELWrapper;
//import com.yomahub.liteflow.builder.el.ThenELWrapper;
//import com.yomahub.liteflow.builder.el.WhenELWrapper;
//
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//
//public class ELBuildUtil {
//
//    private LogicFlowData logicFlowData;
//    private GraphEL graphEL;
//    private boolean formatEL = false;
//
//    private String currNode;
//
//    private List<ELWrapper> wrapperList = new ArrayList<>();
//
//    private ThenELWrapper elWrapper = ELBus.then();
//    private WhenELWrapper whenEL = ELBus.when();
//
//    private ELBuildUtil(){}
//
//    public static ELBuildUtil NEW(){
//        return new ELBuildUtil();
//    }
//
//    public ELBuildUtil parse(String json){
//        this.logicFlowData = ELJsonUtil.getLogicFlowData(json);
//        this.graphEL = GraphEL.getGraphEL(logicFlowData);
//        return this;
//    }
//
//    public ELBuildUtil formatEL(){
//        this.formatEL = true;
//        return this;
//    }
//
//    public String buildEL(){
//        if(logicFlowData.getEdges().isEmpty()){
//            Object[] objects = logicFlowData.getNodes().stream().map(m -> m.getProperties().getComponentId()).toArray();
//            return whenEL.when(objects).toEL(formatEL);
//        }else{
//            Node startNode = this.graphEL.getStartNode();
//            Node endNode = this.graphEL.getEndNode();
//            Set<Node> visited = new HashSet<>();
//            handler(startNode,visited,"THEN");
//            return elWrapper.toEL(formatEL);
//        }
//    }
//
//    private void handler(Node currentNode, Set<Node> visited,String type) {
//        if (!visited.contains(currentNode)) {
//            visited.add(currentNode);
//            String componentId = currentNode.getProperties().getComponentId();
//            if(componentId == null){
//                throw new RuntimeException("组件ID不能为空！");
//            }
//            switch (type) {
//                case "THEN":
//                    elWrapper.then(componentId);
//                    break;
//                case "WHEN":
//                    elWrapper.then(ELBus.when(componentId));
//                    break;
//            }
//            List<Node> nextList = this.graphEL.nextNode(currentNode);
//            List<Node> prevList = this.graphEL.prevNode(currentNode);
//            if(nextList.size() > 1){
//                Node joinNodes = this.graphEL.getJoinNode(currentNode);
//                List<List<Node>> allPaths = this.graphEL.getAllPaths(currentNode, joinNodes, true);
//                List<List<List<Node>>> groupList = this.graphEL.handlerPaths(allPaths);
//                WhenELWrapper whenELWrapper = ELBus.when();
//                for(List<List<Node>> itemList : groupList){
//                    if(itemList.size() == 1) {
//                        List<Node> nodes = itemList.get(0);
//                        Object[] array = nodes.stream().map(m -> m.getProperties().getComponentId()).toArray();
//                        whenELWrapper.when(ELBus.then(array));
//                    }else{
//                        Node node = itemList.get(0).get(0);
//                        Set<Node> visited2 = new HashSet<>();
//                        ThenELWrapper thenELWrapper = ELBus.then();
//                        handlerArea(node, joinNodes, visited2, thenELWrapper, "THEN");
//                        whenELWrapper.when(thenELWrapper);
//                    }
//                }
//                elWrapper.then(whenELWrapper);
//                handler(joinNodes, visited,"THEN");
//            }else if(nextList.size() == 1){
//                handler(nextList.get(0), visited,"THEN");
//            }
//        }
//    }
//
//    private void handlerArea(Node currentNode, Node endNode, Set<Node> visited, ThenELWrapper thenELWrapper, String type) {
//        if (!visited.contains(currentNode)) {
//            visited.add(currentNode);
//            String componentId = currentNode.getProperties().getComponentId();
//            if(componentId == null){
//                throw new RuntimeException("组件ID不能为空！");
//            }
//            switch (type) {
//                case "THEN":
//                    thenELWrapper.then(componentId);
//                    break;
//                case "WHEN":
//                    thenELWrapper.then(ELBus.when(componentId));
//                    break;
//            }
//            List<Node> nextList = this.graphEL.nextNode(currentNode);
//            List<Node> prevList = this.graphEL.prevNode(currentNode);
//            if(nextList.size() > 1){
//                Node joinNodes = this.graphEL.getJoinNode(currentNode);
//                List<List<Node>> allPaths = this.graphEL.getAllPaths(currentNode, joinNodes, true);
//                List<List<List<Node>>> groupList = this.graphEL.handlerPaths(allPaths);
//                WhenELWrapper whenELWrapper = ELBus.when();
//                for(List<List<Node>> itemList : groupList){
//                    if(itemList.size() == 1) {
//                        List<Node> nodes = itemList.get(0);
//                        Object[] array = nodes.stream().map(m -> m.getProperties().getComponentId()).toArray();
//                        whenELWrapper.when(ELBus.then(array));
//                    }else{
//                        Node node = itemList.get(0).get(0);
//                        Set<Node> visited2 = new HashSet<>();
//                        ThenELWrapper eLWrapper = ELBus.then();
//                        handlerArea(node, joinNodes, visited2, eLWrapper, "THEN");
//                        whenELWrapper.when(eLWrapper);
//                    }
//                }
//                thenELWrapper.then(whenELWrapper);
//                if(!joinNodes.getId().equals(endNode.getId())) {
//                    handlerArea(joinNodes, endNode, visited, thenELWrapper,"THEN");
//                }
//            }else if(nextList.size() == 1){
//                Node node = nextList.get(0);
//                if(!node.getId().equals(endNode.getId())){
//                    handlerArea(node, endNode, visited, thenELWrapper, "THEN");
//                }
//            }
//        }
//    }
//
//    public static void main(String[] args) {
//        String buildEL = ELBuildUtil.NEW().parse(ELJson.bx_json_3).formatEL().buildEL();
//        System.out.println(buildEL);
//    }
//
//}
